import copy # 导入模块
import random # 随机数
# 列表的生成
"""
a = [10,20,30,40] # 这个就是列表结构
print(a)

b = [] # 创建了一个空的列表
print(b)

# 通过list强转成列表
c = list(range(0,10))
print(c)
"""
# 我想生成一个从0到9的列表
# 列表新增的方法：
"""
list1 = []
# list1.append(1) # 在末尾追加一个1
# print(list1)
for i in range(10):
    # 第一次循环，i的值是0
    # 第二次循环，i的值是1
    # 第三次循环，i的值是2
    # 。。。
    list1.append(i)  # 0 1 2 3 4 5 6 7 8 9
print(list1)
"""
#  推导式生成列表
# nums = [i for i in range(0,10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
i ：循环变量，需要先定义
for i in range(0,10)： 从0开始，到10结束，循环变量到9
[] ：收集所有的元素，返回列表
"""
# print(nums)
# 收集0~9之间偶数，为一个列表
# nums = [i for i in range(10) if i%2==0]
# print(nums) # [0, 2, 4, 6, 8]
"""
nums1 = [i for i in range(10) if i%2] # i%2 ，真True、假False
print(nums1) # [1, 3, 5, 7, 9]

# 等同于下面
nums2 = [] # 创建了一个空的列表
for i in range(10):
    if i%2:
        nums2.append(i) # 把取余2不等于0的结果添加到nums2列表里
        # print(i,end=" ") # 打印，没有任何含义
print(nums2)
"""
# 不推荐中文命名变量
"""
num3 = [侯雯中 for 侯雯中 in range(10)]
print(num3)
"""
# bool值区分：
# str 字符串
"""
str1 = ""
print(bool(str1)) # 空的字符串为：False
str1 = "1"
print(bool(str1)) # 有任意的内容，都为True
"""
# int 整数
"""
print(bool(0)) # 整数类型，0是False
print(bool(1)) # 整数类型，除0外任意数字:True
"""
nums4 = [(x,y) for x in range(5,10) for y in range(10,20)]
"""
外层循环，从5开始，里层循环从10开始，到19结束
第一次循环：(5,10),(5,11),(5,12),(5,13),(5,14)...(5,19)
第二次循环：(6,10)....(6,19)
第三次循环:...
最后一次循环:(9,10).....(9,19)
"""
# print(nums4)
"""
# 等同于下面
nums5 = []
for i in range(5,10):
    for j in range(10,20):
        nums5.append((i,j)) # 将里面的内容，追加到列表末尾
print(nums5)
"""
"""
nums6 = []
print(nums6) # []
nums6.append("侯雯中")
print(nums6) # ["侯雯中"]
nums6.append("侯plus")
print(nums6) # ["侯雯中","侯plus"]
"""
# 列表推导式排序
"""
ts_file = ['2.ts','4.ts','3.ts','5.ts']
print(ts_file)
print(sorted(ts_file))
# 1. 变成字符串的数字
s1 = [i.replace('.ts','') for i in ts_file]
print(s1) # ['2','3','4','5']
# 2. 变成整数
s2 = [int(i.replace('.ts','')) for i in ts_file]
print(s2) # [2, 3, 4, 5]
# 3. 对生产整数的列表进行排序
s3 = sorted([int(i.replace('.ts','')) for i in ts_file])
print(s3)
# 4. 又变回字符串类型的数字并加上.ts
s4 = [str(j) + '.ts' for j in sorted([int(i.replace('.ts','')) for i in ts_file])]
# [int(i.replace('.ts','')) for i in ts_file]: for j in [2,3,4,5] : str(2) + ".ts"
print(s4)# ['2.ts', '3.ts', '4.ts', '5.ts']
"""
"""
str(j) + '.ts'：需要返回的是字符串类型，并且结尾是'.ts'
for j in sorted([int(i.replace('.ts','')) for i in ts_file])： int(i.replace('.ts',''))，处理完的整数类型
"""
"""
# str.replace() 替换方法
str1 = "来测科技19期班级"
print(str1.replace("19期", "22期"))
"""
# sorted 排序 ，将原来的序列进行排序并返回新的列表，原序列没有变化
"""
list2 = [8,9,5,7,5,35,4,788,99,77,44]
new_list2 = sorted(list2)
print(new_list2) # [4, 5, 5, 7, 8, 9, 35, 44, 77, 99, 788]
print(list2)
"""

# 列表支持下标获取列表元素
"""
a = [10,20,30,40,20,30,20,30]
print(a[0]) # 10
print(a[1]) # 20
print(a[2]) # 30
print(a[-1]) # 30
print(a[-2]) # 20
print(a[0:3]) # [10,20,30]
print(a[::-1]) # [30,20,30,20,40,30,20,10]

# 不能取超出它的长度值，数组越界
print(a[20]) # IndexError: list index out of range
"""
# 内置方法

# 返回20的索引
a = [10,20,30,40,50,20,30,20,30]
# print(a.index(20)) # 1

# 出现多少次 count
# print(a.count(20)) # 3

# 末尾追加元素
a.append(2)
# print(a) # [10, 20, 30, 40, 50, 20, 30, 20, 30, 2]

# sort排序
"""
a.sort() # 默认是升序
print(a)
a.sort(reverse=True)# 降序
print(a)
"""
# sort和sorted区别
"""
sorted： 不改变原来的序列，原来什么样子，还是什么样子，只不过你需要重新赋值拿到结果
sort：基于与拿来的序列去排序
"""
"""
# reverse 倒序返回
a.reverse()
print(a)

# extend: 将一个列表的值追加到另外一个列表里
b = [10,55,77]
a.extend(b)
print(a) # [2, 30, 20, 30, 20, 50, 40, 30, 20, 10, 10, 55, 77]

# clear：清空列表
a.clear()
print(a) # []

# insert 指定位置插入

a.insert(0,5) # 索引0的位置插入一个5
print(a)

a.insert(0,"侯雯中")
print(a)

# copy 复制
b = a.copy()
# print(b) # ['侯雯中', 5]
"""
"""
# + 运算符
list1 = [1,2,3]
list2 = [4,5,6]
print(list1+list2)

# * 运算符
print(list1*2) # [1,2,3,1,2,3]

# del 删除元素  python带的删除方法
del list1[0]
print(list1)

# pop 根据索引删除元素  list数据结构带的删除方法
张琳 = [55,66,77]
张琳.pop(0) # 索引位置
print(张琳)

# remove 删除内容
张琳.remove(77)
print(张琳)

侯雯中= [26,26]
侯雯中.remove(26)
print(侯雯中)

# 修改内容
刘宇晴 = [26,77,88,99]
# print(刘宇晴)
刘宇晴[0] = "辽宁省沈阳市沈河区旭辉中心B座"
刘宇晴[1] = "年龄26岁"
刘宇晴[2] = "手机号15948775135"
刘宇晴[3] = "性别女"
print(刘宇晴)
"""
"""
# max  求列表里的最大值
list1 = [55,99,77,88,44,1245]
print(max(list1)) # 1245
# min  最小值
print(min(list1)) # 44
# sum 求和
print(sum(list1)) # 1608
# avg？没有这个方法，留作业吧
# len：统计长度,python自带的函数
list1 = [5,6,7]
print(len(list1)) # 3
str1 = "45689465"
print(len(str1)) # 8
num = 6666
print(len(str(num))) # 整数类型统计长度，需要转换成字符串对象才可以
set1 = {1,2,5}
print(len(set1)) # 集合类型，也可以用len
"""
# 列表的遍历
# for循环遍历一：
killers = ['李白','兰陵王','韩信','赵云','阿珂','孙悟空']
"""
for i in killers:
    print(i)
"""
# for 循环遍历二：
"""
for i in range(len(killers)):
    # 第一次循环：killers[0]
    # 第二次循环：killers[1]
    # 第三次循环：killers[2]
    print(killers[i])
"""
# print(killers[6]) # IndexError: list index out of range
# while循环遍历
"""
print(len(killers)) # 6
num = 0 # 循环变量，也是索引
while num < len(killers): # num < 长度6
    # killers[0] ：李白
    # killers[1] ：兰陵王0
    print(killers[num])
    num+=1
"""
# 什么是可变数据和不可变数据
# 整数类型是不可以变的
"""
a = 12
b = a
a = 10
print(b) # 12
"""
# 字符串类型是不可以变的
"""
str1 = "侯雯中"
str1[0] = "李"
print(str1) # error，字符串内部成员不可以改变
"""
# 列表类型是可以变的
"""
list1 = [55,66,77]
list1[0] = '侯雯中'
print(list1)
"""
# 判断可变还是不可变？  通过地址值可以看到变化
# 整数类型，值相同的，id地址值也会指向同一处
"""
a1 = 12
b1 = 12
print(f"a1的地址值是：{id(a1)}")
print(f"b1的地址值是：{id(b1)}")

# 没有原地修改的概念，这样做，只是重新赋值而已
a1 = 55
print(f"a1改变后的地址值是：{id(a1)}")
"""
"""
# 字符串类型，值相同的，id地址值也会指向同一处
a_1 = "asd"
b_1 = "asd"
print(f"a_1的地址值是：{id(a_1)}")
print(f"b_1的地址值是：{id(b_1)}")
"""
# 字符串不支持原地修改，因为它是不可变的数据结构
# a_1[0] = "asd1" # TypeError: 'str' object does not support item assignment
"""
# 列表类型，值相同的，id地址值不一样
a_list = [1,2,3]
b_list = [1,2,3]
print(f"a_list的地址值是：{id(a_list)}")
print(f"b_list的地址值是：{id(b_list)}")

# 可变的结构，支持原地修改
a_list[0] = "侯雯中"
print(a_list)
"""

x = [100,200,300]
"""
# = 赋值
print(id(x))
y = x # 等号是内存地址的赋值
print(id(y))
"""
# 浅拷贝
b = x.copy() # 拷贝列表
"""
print(b)
print(id(b))
print(x)
print(id(x))
"""
"""
print(id(x[0]))
print(id(b[0]))
"""
a = copy.copy(x) # 通过x列表复制了一个给到a
"""
print(a)
print(x)
print(id(a))
print(id(x))
"""
"""
浅拷贝：
1、拷贝出来的列表本身是开辟了一个新的物理空间地址
2、拷贝出来的列表成员和原列表内容一致、地址值一致
"""

# 深拷贝
b1 = [[100,200],100,200,300]
c1 = copy.deepcopy(b1) # 深拷贝的方法
"""
print(id(b1))
print(id(c1))
"""
"""
print(b1[0][0])
print(c1[0][1])
print(id(b1[0]))
print(id(c1[0]))
"""
"""
深拷贝：
1、拷贝出来的列表本身开辟了一个新的空间地址
2、拷贝出来的成员对象，即使和原来的内容一致，也会开辟新的空间地址
"""

#有一个员工列表 names = ['张三,'李四','王二麻子','周周'] 输入一个员工的名字 如果员工存在那么不添加 如果员工不存在则添加员工
"""
names = ['张三','李四','王二麻子','周周']
name = input("请输入员工姓名")
if name in names:
    print(f"{name}员工存在于员工列表中")
else:
    # names.append(name) # 追加于列表末尾里
    names.insert(0,name)
    print(f"员工：{name}不存在于列表，已经成功添加！")
for i in range(len(names)):
    print(f"第{i+1}个员工姓名是：{names[i]}")
"""


# 嵌套列表的访问
"""
a1=[["龙小一",18,30000,"武汉"], ["龙小二",19,20000,"武汉"], ["龙小五",20,10000,"武汉"]]
print(a1)
print(a1[0][2])
print(a1[1][2])
print(a1[2][2])
"""

# 一个学校,有三个办公室,现在有10位老师等待工位的分配,
# 请编写程序,完成随机的分配
"""
ran_num = random.randint(0,9) # 从0开始到9随机生成一位并返回
print(ran_num)

ran_num = random.choice([100,200,300])# 从一个序列里随机返回一位
print(ran_num)
"""
teachers = ['A','B','C','D','E','F','G','H','I','J']
rooms = [[],[],[]]
# 遍历teachers每一个老师
for teacher in teachers:
    # 随机返回一个空的列表
    room = random.choice(rooms) # 从一个序列里随机返回一个
    # 把随机返回一个的空列表，加上teacher
    room.append(teacher)
print(rooms) # [['E'], ['A', 'B', 'C', 'G', 'H'], ['D', 'F', 'I', 'J']]
# 打印所有房间和老师
for i,room in enumerate(rooms):
    print("第%d个房间有%d个老师，分别是"%(i+1,len(room)),end=" ")
    # 第一个room：['E']
    # 第二个room：['A', 'B', 'C', 'G', 'H']
    # 第三个room：['D', 'F', 'I', 'J']
    for teacher in room:
        print(teacher,end="\t")
    print()


# enumerate： 枚举值
teachers1 = ['A','B','C','D','E','F','G','H','I','J']
# for i in teachers1:
#     print(i)
"""
for 我是枚举的变量,我是每一次索引的值 in enumerate(teachers1):
    print(我是枚举的变量,我是每一次索引的值) # i 索引位置  j 每一个索引位置对应的值
"""
"""
0 A
1 B
2 C
3 D
4 E
5 F
6 G
7 H
8 I
9 J
"""
